import cv2  # OpenCV，用于图像处理
import numpy as np  # NumPy，用于科学计算
from skimage import io, img_as_float  # skimage的io和img_as_float，用于图像读取和转换
import joblib  # joblib，用于对象的序列化和反序列化
import yaml  # yaml，用于读取配置文件
import time  # time，用于计算运行时间
import os  # os，用于获取文件大小


# 获取 0_setting.yaml 中的制定键对应的值
def get_config_value(key):
    """获取配置文件中的指定键对应的值"""
    with open("0_setting.yaml", "r", encoding='UTF-8') as f:
        config = yaml.safe_load(f)
    return config[key]


def preprocess_image(file_name, new_size):
    """
    预处理图像：读取图像，调整大小，并展平为一维数组
    """
    # 以灰度模式读取图像，并将图像转为浮点类型
    img = img_as_float(io.imread(file_name, as_gray=True))
    # 调整图像大小
    img = cv2.resize(img, new_size)
    # 将图像展平为一维数组
    img = img.ravel()

    return img


def save_file(file, filename, loc):
    """
    保存文件到指定路径，并打印保存信息和运行时间
    """
    start = time.time()
    print(f"正在将 {filename} 保存到 {loc}")
    joblib.dump(file, loc)
    end = time.time()
    print(f"保存完毕，文件位置: {loc}, 文件大小: {os.path.getsize(loc) / 1024 / 1024:.3f}M")
    print(f"运行时间: {end - start:.3f}秒")


def load_file(filename, loc):
    """
    从指定路径加载文件，并打印加载信息
    """
    print(f"正在从 {loc} 加载文件 {filename}")
    return joblib.load(loc)
